Mercurial > hg
diff mercurial/merge.py @ 43077:687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Done with
python3.7 contrib/byteify-strings.py -i $(hg files 'set:mercurial/**.py - mercurial/thirdparty/** + hgext/**.py - hgext/fsmonitor/pywatchman/** - mercurial/__init__.py')
black -l 80 -t py33 -S $(hg files 'set:**.py - mercurial/thirdparty/** - "contrib/python-zstandard/**" - hgext/fsmonitor/pywatchman/**')
# skip-blame mass-reformatting only
Differential Revision: https://phab.mercurial-scm.org/D6972
author | Augie Fackler <augie@google.com> |
---|---|
date | Sun, 06 Oct 2019 09:48:39 -0400 |
parents | 2372284d9457 |
children | 1f339b503a40 |
line wrap: on
line diff
--- a/mercurial/merge.py Sun Oct 06 09:45:02 2019 -0400 +++ b/mercurial/merge.py Sun Oct 06 09:48:39 2019 -0400 @@ -44,9 +44,9 @@ def _droponode(data): # used for compatibility for v1 - bits = data.split('\0') + bits = data.split(b'\0') bits = bits[:-2] + bits[-1:] - return '\0'.join(bits) + return b'\0'.join(bits) # Merge state record types. See ``mergestate`` docs for more. @@ -138,8 +138,8 @@ 'pu' and 'pr' for path conflicts. ''' - statepathv1 = 'merge/state' - statepathv2 = 'merge/state2' + statepathv1 = b'merge/state' + statepathv2 = b'merge/state2' @staticmethod def clean(repo, node=None, other=None, labels=None): @@ -170,7 +170,7 @@ self._local = None self._other = None self._labels = labels - for var in ('localctx', 'otherctx'): + for var in (b'localctx', b'otherctx'): if var in vars(self): delattr(self, var) if node: @@ -181,7 +181,7 @@ self._mdstate = MERGE_DRIVER_STATE_SUCCESS else: self._mdstate = MERGE_DRIVER_STATE_UNMARKED - shutil.rmtree(self._repo.vfs.join('merge'), True) + shutil.rmtree(self._repo.vfs.join(b'merge'), True) self._results = {} self._dirty = False @@ -195,7 +195,7 @@ self._stateextras = {} self._local = None self._other = None - for var in ('localctx', 'otherctx'): + for var in (b'localctx', b'otherctx'): if var in vars(self): delattr(self, var) self._readmergedriver = None @@ -208,7 +208,7 @@ elif rtype == RECORD_OTHER: self._other = bin(record) elif rtype == RECORD_MERGE_DRIVER_STATE: - bits = record.split('\0', 1) + bits = record.split(b'\0', 1) mdstate = bits[1] if len(mdstate) != 1 or mdstate not in ( MERGE_DRIVER_STATE_UNMARKED, @@ -226,11 +226,11 @@ RECORD_PATH_CONFLICT, RECORD_MERGE_DRIVER_MERGE, ): - bits = record.split('\0') + bits = record.split(b'\0') self._state[bits[0]] = bits[1:] elif rtype == RECORD_FILE_VALUES: - filename, rawextras = record.split('\0', 1) - extraparts = rawextras.split('\0') + filename, rawextras = record.split(b'\0', 1) + extraparts = rawextras.split(b'\0') extras = {} i = 0 while i < len(extraparts): @@ -239,7 +239,7 @@ self._stateextras[filename] = extras elif rtype == RECORD_LABELS: - labels = record.split('\0', 2) + labels = record.split(b'\0', 2) self._labels = [l for l in labels if len(l) > 0] elif not rtype.islower(): unsupported.add(rtype) @@ -278,9 +278,9 @@ # if mctx was wrong `mctx[bits[-2]]` may fails. for idx, r in enumerate(v1records): if r[0] == RECORD_MERGED: - bits = r[1].split('\0') - bits.insert(-2, '') - v1records[idx] = (r[0], '\0'.join(bits)) + bits = r[1].split(b'\0') + bits.insert(-2, b'') + v1records[idx] = (r[0], b'\0'.join(bits)) return v1records def _v1v2match(self, v1records, v2records): @@ -346,7 +346,7 @@ while off < end: rtype = data[off : off + 1] off += 1 - length = _unpack('>I', data[off : (off + 4)])[0] + length = _unpack(b'>I', data[off : (off + 4)])[0] off += 4 record = data[off : (off + length)] off += length @@ -369,14 +369,16 @@ # - B inspects .hgrc and finds it to be clean # - B then continues the merge and the malicious merge driver # gets invoked - configmergedriver = self._repo.ui.config('experimental', 'mergedriver') + configmergedriver = self._repo.ui.config( + b'experimental', b'mergedriver' + ) if ( self._readmergedriver is not None and self._readmergedriver != configmergedriver ): raise error.ConfigError( - _("merge driver changed since merge started"), - hint=_("revert merge driver change or abort merge"), + _(b"merge driver changed since merge started"), + hint=_(b"revert merge driver change or abort merge"), ) return configmergedriver @@ -384,14 +386,14 @@ @util.propertycache def localctx(self): if self._local is None: - msg = "localctx accessed but self._local isn't set" + msg = b"localctx accessed but self._local isn't set" raise error.ProgrammingError(msg) return self._repo[self._local] @util.propertycache def otherctx(self): if self._other is None: - msg = "otherctx accessed but self._other isn't set" + msg = b"otherctx accessed but self._other isn't set" raise error.ProgrammingError(msg) return self._repo[self._other] @@ -425,7 +427,7 @@ records.append( ( RECORD_MERGE_DRIVER_STATE, - '\0'.join([self.mergedriver, self._mdstate]), + b'\0'.join([self.mergedriver, self._mdstate]), ) ) # Write out state items. In all cases, the value of the state map entry @@ -437,7 +439,7 @@ if v[0] == MERGE_RECORD_DRIVER_RESOLVED: # Driver-resolved merge. These are stored in 'D' records. records.append( - (RECORD_MERGE_DRIVER_MERGE, '\0'.join([filename] + v)) + (RECORD_MERGE_DRIVER_MERGE, b'\0'.join([filename] + v)) ) elif v[0] in ( MERGE_RECORD_UNRESOLVED_PATH, @@ -446,7 +448,7 @@ # Path conflicts. These are stored in 'P' records. The current # resolution state ('pu' or 'pr') is stored within the record. records.append( - (RECORD_PATH_CONFLICT, '\0'.join([filename] + v)) + (RECORD_PATH_CONFLICT, b'\0'.join([filename] + v)) ) elif v[1] == nullhex or v[6] == nullhex: # Change/Delete or Delete/Change conflicts. These are stored in @@ -454,20 +456,20 @@ # file is deleted locally ('dc'). v[6] is the remote file, and # is nullhex when the file is deleted remotely ('cd'). records.append( - (RECORD_CHANGEDELETE_CONFLICT, '\0'.join([filename] + v)) + (RECORD_CHANGEDELETE_CONFLICT, b'\0'.join([filename] + v)) ) else: # Normal files. These are stored in 'F' records. - records.append((RECORD_MERGED, '\0'.join([filename] + v))) + records.append((RECORD_MERGED, b'\0'.join([filename] + v))) for filename, extras in sorted(self._stateextras.iteritems()): - rawextras = '\0'.join( - '%s\0%s' % (k, v) for k, v in extras.iteritems() + rawextras = b'\0'.join( + b'%s\0%s' % (k, v) for k, v in extras.iteritems() ) records.append( - (RECORD_FILE_VALUES, '%s\0%s' % (filename, rawextras)) + (RECORD_FILE_VALUES, b'%s\0%s' % (filename, rawextras)) ) if self._labels is not None: - labels = '\0'.join(self._labels) + labels = b'\0'.join(self._labels) records.append((RECORD_LABELS, labels)) return records @@ -478,14 +480,14 @@ def _writerecordsv1(self, records): """Write current state on disk in a version 1 file""" - f = self._repo.vfs(self.statepathv1, 'wb') + f = self._repo.vfs(self.statepathv1, b'wb') irecords = iter(records) lrecords = next(irecords) assert lrecords[0] == RECORD_LOCAL - f.write(hex(self._local) + '\n') + f.write(hex(self._local) + b'\n') for rtype, data in irecords: if rtype == RECORD_MERGED: - f.write('%s\n' % _droponode(data)) + f.write(b'%s\n' % _droponode(data)) f.close() def _writerecordsv2(self, records): @@ -494,12 +496,12 @@ See the docstring for _readrecordsv2 for why we use 't'.""" # these are the records that all version 2 clients can read allowlist = (RECORD_LOCAL, RECORD_OTHER, RECORD_MERGED) - f = self._repo.vfs(self.statepathv2, 'wb') + f = self._repo.vfs(self.statepathv2, b'wb') for key, data in records: assert len(key) == 1 if key not in allowlist: - key, data = RECORD_OVERRIDE, '%s%s' % (key, data) - format = '>sI%is' % len(data) + key, data = RECORD_OVERRIDE, b'%s%s' % (key, data) + format = b'>sI%is' % len(data) f.write(_pack(format, key, len(data), data)) f.close() @@ -523,7 +525,7 @@ localkey = nullhex else: localkey = mergestate.getlocalkey(fcl.path()) - self._repo.vfs.write('merge/' + localkey, fcl.data()) + self._repo.vfs.write(b'merge/' + localkey, fcl.data()) self._state[fd] = [ MERGE_RECORD_UNRESOLVED, localkey, @@ -534,7 +536,7 @@ hex(fco.filenode()), fcl.flags(), ] - self._stateextras[fd] = {'ancestorlinknode': hex(fca.node())} + self._stateextras[fd] = {b'ancestorlinknode': hex(fca.node())} self._dirty = True def addpath(self, path, frename, forigin): @@ -593,7 +595,7 @@ state, localkey, lfile, afile, anode, ofile, onode, flags = stateentry octx = self._repo[self._other] extras = self.extras(dfile) - anccommitnode = extras.get('ancestorlinknode') + anccommitnode = extras.get(b'ancestorlinknode') if anccommitnode: actx = self._repo[anccommitnode] else: @@ -605,13 +607,13 @@ # "premerge" x flags flo = fco.flags() fla = fca.flags() - if 'x' in flags + flo + fla and 'l' not in flags + flo + fla: + if b'x' in flags + flo + fla and b'l' not in flags + flo + fla: if fca.node() == nullid and flags != flo: if preresolve: self._repo.ui.warn( _( - 'warning: cannot merge flags for %s ' - 'without common ancestor - keeping local flags\n' + b'warning: cannot merge flags for %s ' + b'without common ancestor - keeping local flags\n' ) % afile ) @@ -620,7 +622,7 @@ if preresolve: # restore local if localkey != nullhex: - f = self._repo.vfs('merge/' + localkey) + f = self._repo.vfs(b'merge/' + localkey) wctx[dfile].write(f.read(), flags) f.close() else: @@ -724,7 +726,7 @@ } for f, (r, action) in self._results.iteritems(): if action is not None: - actions[action].append((f, None, "merge result")) + actions[action].append((f, None, b"merge result")) return actions def recordactions(self): @@ -753,11 +755,11 @@ def _getcheckunknownconfig(repo, section, name): config = repo.ui.config(section, name) - valid = ['abort', 'ignore', 'warn'] + valid = [b'abort', b'ignore', b'warn'] if config not in valid: - validstr = ', '.join(["'" + v + "'" for v in valid]) + validstr = b', '.join([b"'" + v + b"'" for v in valid]) raise error.ConfigError( - _("%s.%s not valid " "('%s' is none of %s)") + _(b"%s.%s not valid " b"('%s' is none of %s)") % (section, name, config, validstr) ) return config @@ -848,15 +850,17 @@ pathconflicts = set() warnconflicts = set() abortconflicts = set() - unknownconfig = _getcheckunknownconfig(repo, 'merge', 'checkunknown') - ignoredconfig = _getcheckunknownconfig(repo, 'merge', 'checkignored') - pathconfig = repo.ui.configbool('experimental', 'merge.checkpathconflicts') + unknownconfig = _getcheckunknownconfig(repo, b'merge', b'checkunknown') + ignoredconfig = _getcheckunknownconfig(repo, b'merge', b'checkignored') + pathconfig = repo.ui.configbool( + b'experimental', b'merge.checkpathconflicts' + ) if not force: def collectconflicts(conflicts, config): - if config == 'abort': + if config == b'abort': abortconflicts.update(conflicts) - elif config == 'warn': + elif config == b'warn': warnconflicts.update(conflicts) checkunknowndirs = _unknowndirschecker() @@ -900,42 +904,42 @@ # don't like an abort happening in the middle of # merge.update. if not different: - actions[f] = (ACTION_GET, (fl2, False), 'remote created') - elif mergeforce or config == 'abort': + actions[f] = (ACTION_GET, (fl2, False), b'remote created') + elif mergeforce or config == b'abort': actions[f] = ( ACTION_MERGE, (f, f, None, False, anc), - 'remote differs from untracked local', + b'remote differs from untracked local', ) - elif config == 'abort': + elif config == b'abort': abortconflicts.add(f) else: - if config == 'warn': + if config == b'warn': warnconflicts.add(f) - actions[f] = (ACTION_GET, (fl2, True), 'remote created') + actions[f] = (ACTION_GET, (fl2, True), b'remote created') for f in sorted(abortconflicts): warn = repo.ui.warn if f in pathconflicts: if repo.wvfs.isfileorlink(f): - warn(_("%s: untracked file conflicts with directory\n") % f) + warn(_(b"%s: untracked file conflicts with directory\n") % f) else: - warn(_("%s: untracked directory conflicts with file\n") % f) + warn(_(b"%s: untracked directory conflicts with file\n") % f) else: - warn(_("%s: untracked file differs\n") % f) + warn(_(b"%s: untracked file differs\n") % f) if abortconflicts: raise error.Abort( _( - "untracked files in working directory " - "differ from files in requested revision" + b"untracked files in working directory " + b"differ from files in requested revision" ) ) for f in sorted(warnconflicts): if repo.wvfs.isfileorlink(f): - repo.ui.warn(_("%s: replacing untracked file\n") % f) + repo.ui.warn(_(b"%s: replacing untracked file\n") % f) else: - repo.ui.warn(_("%s: replacing untracked files in directory\n") % f) + repo.ui.warn(_(b"%s: replacing untracked files in directory\n") % f) for f, (m, args, msg) in actions.iteritems(): if m == ACTION_CREATED: @@ -969,12 +973,12 @@ m = ACTION_REMOVE for f in wctx.deleted(): if f not in mctx: - actions[f] = m, None, "forget deleted" + actions[f] = m, None, b"forget deleted" if not branchmerge: for f in wctx.removed(): if f not in mctx: - actions[f] = ACTION_FORGET, None, "forget removed" + actions[f] = ACTION_FORGET, None, b"forget removed" return actions @@ -1032,22 +1036,22 @@ fold = util.normcase(f) if fold in foldmap: raise error.Abort( - _("case-folding collision between %s and %s") + _(b"case-folding collision between %s and %s") % (f, foldmap[fold]) ) foldmap[fold] = f # check case-folding of directories - foldprefix = unfoldprefix = lastfull = '' + foldprefix = unfoldprefix = lastfull = b'' for fold, f in sorted(foldmap.items()): if fold.startswith(foldprefix) and not f.startswith(unfoldprefix): # the folded prefix matches but actual casing is different raise error.Abort( - _("case-folding collision between " "%s and directory of %s") + _(b"case-folding collision between " b"%s and directory of %s") % (lastfull, f) ) - foldprefix = fold + '/' - unfoldprefix = f + '/' + foldprefix = fold + b'/' + unfoldprefix = f + b'/' lastfull = f @@ -1154,18 +1158,18 @@ # Rename all local conflicting files that have not been deleted. for p in localconflicts: if p not in deletedfiles: - ctxname = bytes(wctx).rstrip('+') + ctxname = bytes(wctx).rstrip(b'+') pnew = util.safename(p, ctxname, wctx, set(actions.keys())) actions[pnew] = ( ACTION_PATH_CONFLICT_RESOLVE, (p,), - 'local path conflict', + b'local path conflict', ) - actions[p] = (ACTION_PATH_CONFLICT, (pnew, 'l'), 'path conflict') + actions[p] = (ACTION_PATH_CONFLICT, (pnew, b'l'), b'path conflict') if remoteconflicts: # Check if all files in the conflicting directories have been removed. - ctxname = bytes(mctx).rstrip('+') + ctxname = bytes(mctx).rstrip(b'+') for f, p in _filesindirs(repo, mf, remoteconflicts): if f not in deletedfiles: m, args, msg = actions[p] @@ -1179,20 +1183,20 @@ actions[pnew] = ( ACTION_LOCAL_DIR_RENAME_GET, (p, fl), - 'remote path conflict', + b'remote path conflict', ) actions[p] = ( ACTION_PATH_CONFLICT, (pnew, ACTION_REMOVE), - 'path conflict', + b'path conflict', ) remoteconflicts.remove(p) break if invalidconflicts: for p in invalidconflicts: - repo.ui.warn(_("%s: is both a file and a directory\n") % p) - raise error.Abort(_("destination manifest contains path conflicts")) + repo.ui.warn(_(b"%s: is both a file and a directory\n") % p) + raise error.Abort(_(b"destination manifest contains path conflicts")) def _filternarrowactions(narrowmatch, branchmerge, actions): @@ -1202,8 +1206,8 @@ Raise an exception if the merge cannot be completed because the repo is narrowed. """ - nooptypes = {'k'} # TODO: handle with nonconflicttypes - nonconflicttypes = set('a am c cm f g r e'.split()) + nooptypes = {b'k'} # TODO: handle with nonconflicttypes + nonconflicttypes = set(b'a am c cm f g r e'.split()) # We mutate the items in the dict during iteration, so iterate # over a copy. for f, action in list(actions.items()): @@ -1216,15 +1220,15 @@ elif action[0] in nonconflicttypes: raise error.Abort( _( - 'merge affects file \'%s\' outside narrow, ' - 'which is not yet supported' + b'merge affects file \'%s\' outside narrow, ' + b'which is not yet supported' ) % f, - hint=_('merging in the other direction ' 'may work'), + hint=_(b'merging in the other direction ' b'may work'), ) else: raise error.Abort( - _('conflict in file \'%s\' is outside ' 'narrow clone') % f + _(b'conflict in file \'%s\' is outside ' b'narrow clone') % f ) @@ -1265,22 +1269,22 @@ boolbm = pycompat.bytestr(bool(branchmerge)) boolf = pycompat.bytestr(bool(force)) boolm = pycompat.bytestr(bool(matcher)) - repo.ui.note(_("resolving manifests\n")) + repo.ui.note(_(b"resolving manifests\n")) repo.ui.debug( - " branchmerge: %s, force: %s, partial: %s\n" % (boolbm, boolf, boolm) + b" branchmerge: %s, force: %s, partial: %s\n" % (boolbm, boolf, boolm) ) - repo.ui.debug(" ancestor: %s, local: %s, remote: %s\n" % (pa, wctx, p2)) + repo.ui.debug(b" ancestor: %s, local: %s, remote: %s\n" % (pa, wctx, p2)) m1, m2, ma = wctx.manifest(), p2.manifest(), pa.manifest() copied = set(copy.values()) copied.update(movewithdir.values()) - if '.hgsubstate' in m1 and wctx.rev() is None: + if b'.hgsubstate' in m1 and wctx.rev() is None: # Check whether sub state is modified, and overwrite the manifest # to flag the change. If wctx is a committed revision, we shouldn't # care for the dirty state of the working directory. if any(wctx.sub(s).dirty() for s in wctx.substate): - m1['.hgsubstate'] = modifiednodeid + m1[b'.hgsubstate'] = modifiednodeid # Don't use m2-vs-ma optimization if: # - ma is the same as m1 or m2, which we're just going to diff again later @@ -1312,38 +1316,42 @@ actions[f] = ( ACTION_MERGE, (f, f, fa, False, pa.node()), - 'both renamed from %s' % fa, + b'both renamed from %s' % fa, ) else: actions[f] = ( ACTION_MERGE, (f, f, None, False, pa.node()), - 'both created', + b'both created', ) else: a = ma[f] fla = ma.flags(f) - nol = 'l' not in fl1 + fl2 + fla + nol = b'l' not in fl1 + fl2 + fla if n2 == a and fl2 == fla: - actions[f] = (ACTION_KEEP, (), 'remote unchanged') + actions[f] = (ACTION_KEEP, (), b'remote unchanged') elif n1 == a and fl1 == fla: # local unchanged - use remote if n1 == n2: # optimization: keep local content - actions[f] = (ACTION_EXEC, (fl2,), 'update permissions') + actions[f] = ( + ACTION_EXEC, + (fl2,), + b'update permissions', + ) else: actions[f] = ( ACTION_GET, (fl2, False), - 'remote is newer', + b'remote is newer', ) elif nol and n2 == a: # remote only changed 'x' - actions[f] = (ACTION_EXEC, (fl2,), 'update permissions') + actions[f] = (ACTION_EXEC, (fl2,), b'update permissions') elif nol and n1 == a: # local only changed 'x' - actions[f] = (ACTION_GET, (fl1, False), 'remote is newer') + actions[f] = (ACTION_GET, (fl1, False), b'remote is newer') else: # both changed something actions[f] = ( ACTION_MERGE, (f, f, f, False, pa.node()), - 'versions differ', + b'versions differ', ) elif n1: # file exists only on local side if f in copied: @@ -1354,38 +1362,38 @@ actions[f2] = ( ACTION_MERGE, (f, f2, None, True, pa.node()), - 'remote directory rename, both created', + b'remote directory rename, both created', ) else: actions[f2] = ( ACTION_DIR_RENAME_MOVE_LOCAL, (f, fl1), - 'remote directory rename - move from %s' % f, + b'remote directory rename - move from %s' % f, ) elif f in copy: f2 = copy[f] actions[f] = ( ACTION_MERGE, (f, f2, f2, False, pa.node()), - 'local copied/moved from %s' % f2, + b'local copied/moved from %s' % f2, ) elif f in ma: # clean, a different, no remote if n1 != ma[f]: if acceptremote: - actions[f] = (ACTION_REMOVE, None, 'remote delete') + actions[f] = (ACTION_REMOVE, None, b'remote delete') else: actions[f] = ( ACTION_CHANGED_DELETED, (f, None, f, False, pa.node()), - 'prompt changed/deleted', + b'prompt changed/deleted', ) elif n1 == addednodeid: # This extra 'a' is added by working copy manifest to mark # the file as locally added. We should forget it instead of # deleting it. - actions[f] = (ACTION_FORGET, None, 'remote deleted') + actions[f] = (ACTION_FORGET, None, b'remote deleted') else: - actions[f] = (ACTION_REMOVE, None, 'other deleted') + actions[f] = (ACTION_REMOVE, None, b'other deleted') elif n2: # file exists only on remote side if f in copied: pass # we'll deal with it on m1 side @@ -1395,13 +1403,13 @@ actions[f2] = ( ACTION_MERGE, (f2, f, None, False, pa.node()), - 'local directory rename, both created', + b'local directory rename, both created', ) else: actions[f2] = ( ACTION_LOCAL_DIR_RENAME_GET, (f, fl2), - 'local directory rename - get from %s' % f, + b'local directory rename - get from %s' % f, ) elif f in copy: f2 = copy[f] @@ -1409,13 +1417,13 @@ actions[f] = ( ACTION_MERGE, (f2, f, f2, False, pa.node()), - 'remote copied from %s' % f2, + b'remote copied from %s' % f2, ) else: actions[f] = ( ACTION_MERGE, (f2, f, f2, True, pa.node()), - 'remote moved from %s' % f2, + b'remote moved from %s' % f2, ) elif f not in ma: # local unknown, remote created: the logic is described by the @@ -1430,14 +1438,14 @@ # Checking whether the files are different is expensive, so we # don't do that when we can avoid it. if not force: - actions[f] = (ACTION_CREATED, (fl2,), 'remote created') + actions[f] = (ACTION_CREATED, (fl2,), b'remote created') elif not branchmerge: - actions[f] = (ACTION_CREATED, (fl2,), 'remote created') + actions[f] = (ACTION_CREATED, (fl2,), b'remote created') else: actions[f] = ( ACTION_CREATED_MERGE, (fl2, pa.node()), - 'remote created, get or merge', + b'remote created, get or merge', ) elif n2 != ma[f]: df = None @@ -1450,18 +1458,19 @@ actions[df] = ( ACTION_MERGE, (df, f, f, False, pa.node()), - 'local directory rename - respect move ' 'from %s' % f, + b'local directory rename - respect move ' + b'from %s' % f, ) elif acceptremote: - actions[f] = (ACTION_CREATED, (fl2,), 'remote recreating') + actions[f] = (ACTION_CREATED, (fl2,), b'remote recreating') else: actions[f] = ( ACTION_DELETED_CHANGED, (None, f, f, False, pa.node()), - 'prompt deleted/changed', + b'prompt deleted/changed', ) - if repo.ui.configbool('experimental', 'merge.checkpathconflicts'): + if repo.ui.configbool(b'experimental', b'merge.checkpathconflicts'): # If we are merging, look for path conflicts. checkpathconflicts(repo, wctx, p2, actions) @@ -1485,7 +1494,7 @@ and not wctx[f].cmp(ancestor[f]) ): # local did change but ended up with same content - actions[f] = ACTION_REMOVE, None, 'prompt same' + actions[f] = ACTION_REMOVE, None, b'prompt same' elif ( m == ACTION_DELETED_CHANGED and f in ancestor @@ -1527,11 +1536,11 @@ else: # only when merge.preferancestor=* - the default repo.ui.note( - _("note: merging %s and %s using bids from ancestors %s\n") + _(b"note: merging %s and %s using bids from ancestors %s\n") % ( wctx, mctx, - _(' and ').join(pycompat.bytestr(anc) for anc in ancestors), + _(b' and ').join(pycompat.bytestr(anc) for anc in ancestors), ) ) @@ -1541,7 +1550,7 @@ ) # mapping filename to bids (action method to list af actions) diverge, renamedelete = None, None for ancestor in ancestors: - repo.ui.note(_('\ncalculating bids for ancestor %s\n') % ancestor) + repo.ui.note(_(b'\ncalculating bids for ancestor %s\n') % ancestor) actions, diverge1, renamedelete1 = manifestmerge( repo, wctx, @@ -1565,7 +1574,7 @@ for f, a in sorted(actions.iteritems()): m, args, msg = a - repo.ui.debug(' %s: %s -> %s\n' % (f, msg, m)) + repo.ui.debug(b' %s: %s -> %s\n' % (f, msg, m)) if f in fbids: d = fbids[f] if m in d: @@ -1576,7 +1585,7 @@ fbids[f] = {m: [a]} # Pick the best bid for each file - repo.ui.note(_('\nauction for merging merge bids\n')) + repo.ui.note(_(b'\nauction for merging merge bids\n')) actions = {} for f, bids in sorted(fbids.items()): # bids is a mapping from action method to list af actions @@ -1584,35 +1593,35 @@ if len(bids) == 1: # all bids are the same kind of method m, l = list(bids.items())[0] if all(a == l[0] for a in l[1:]): # len(bids) is > 1 - repo.ui.note(_(" %s: consensus for %s\n") % (f, m)) + repo.ui.note(_(b" %s: consensus for %s\n") % (f, m)) actions[f] = l[0] continue # If keep is an option, just do it. if ACTION_KEEP in bids: - repo.ui.note(_(" %s: picking 'keep' action\n") % f) + repo.ui.note(_(b" %s: picking 'keep' action\n") % f) actions[f] = bids[ACTION_KEEP][0] continue # If there are gets and they all agree [how could they not?], do it. if ACTION_GET in bids: ga0 = bids[ACTION_GET][0] if all(a == ga0 for a in bids[ACTION_GET][1:]): - repo.ui.note(_(" %s: picking 'get' action\n") % f) + repo.ui.note(_(b" %s: picking 'get' action\n") % f) actions[f] = ga0 continue # TODO: Consider other simple actions such as mode changes # Handle inefficient democrazy. - repo.ui.note(_(' %s: multiple bids for merge action:\n') % f) + repo.ui.note(_(b' %s: multiple bids for merge action:\n') % f) for m, l in sorted(bids.items()): for _f, args, msg in l: - repo.ui.note(' %s -> %s\n' % (msg, m)) + repo.ui.note(b' %s -> %s\n' % (msg, m)) # Pick random action. TODO: Instead, prompt user when resolving m, l = list(bids.items())[0] repo.ui.warn( - _(' %s: ambiguous merge - picked %s action\n') % (f, m) + _(b' %s: ambiguous merge - picked %s action\n') % (f, m) ) actions[f] = l[0] continue - repo.ui.note(_('end of auction\n\n')) + repo.ui.note(_(b'end of auction\n\n')) if wctx.rev() is None: fractions = _forgetremoved(wctx, mctx, branchmerge) @@ -1644,15 +1653,15 @@ cwd = _getcwd() i = 0 for f, args, msg in actions: - repo.ui.debug(" %s: %s -> r\n" % (f, msg)) + repo.ui.debug(b" %s: %s -> r\n" % (f, msg)) if verbose: - repo.ui.note(_("removing %s\n") % f) + repo.ui.note(_(b"removing %s\n") % f) wctx[f].audit() try: wctx[f].remove(ignoremissing=True) except OSError as inst: repo.ui.warn( - _("update failed to remove %s: %s!\n") % (f, inst.strerror) + _(b"update failed to remove %s: %s!\n") % (f, inst.strerror) ) if i == 100: yield i, f @@ -1666,8 +1675,8 @@ # warning. repo.ui.warn( _( - "current directory was removed\n" - "(consider changing to repo root: %s)\n" + b"current directory was removed\n" + b"(consider changing to repo root: %s)\n" ) % repo.root ) @@ -1690,9 +1699,9 @@ i = 0 with repo.wvfs.backgroundclosing(ui, expectedcount=len(actions)): for f, (flags, backup), msg in actions: - repo.ui.debug(" %s: %s -> g\n" % (f, msg)) + repo.ui.debug(b" %s: %s -> g\n" % (f, msg)) if verbose: - repo.ui.note(_("getting %s\n") % f) + repo.ui.note(_(b"getting %s\n") % f) if backup: # If a file or directory exists with the same name, back that @@ -1709,7 +1718,7 @@ util.rename(repo.wjoin(conflicting), orig) wfctx = wctx[f] wfctx.clearunknown() - atomictemp = ui.configbool("experimental", "update.atomic-file") + atomictemp = ui.configbool(b"experimental", b"update.atomic-file") size = wfctx.write( fctx(f).data(), flags, @@ -1822,12 +1831,12 @@ mergeactions.extend(actions[ACTION_MERGE]) for f, args, msg in mergeactions: f1, f2, fa, move, anc = args - if f == '.hgsubstate': # merged internally + if f == b'.hgsubstate': # merged internally continue if f1 is None: fcl = filemerge.absentfilectx(wctx, fa) else: - repo.ui.debug(" preserving %s for resolve of %s\n" % (f1, f)) + repo.ui.debug(b" preserving %s for resolve of %s\n" % (f1, f)) fcl = wctx[f1] if f2 is None: fco = filemerge.absentfilectx(mctx, fa) @@ -1846,16 +1855,16 @@ # remove renamed files after safely stored for f in moves: if wctx[f].lexists(): - repo.ui.debug("removing %s\n" % f) + repo.ui.debug(b"removing %s\n" % f) wctx[f].audit() wctx[f].remove() numupdates = sum(len(l) for m, l in actions.items() if m != ACTION_KEEP) progress = repo.ui.makeprogress( - _('updating'), unit=_('files'), total=numupdates + _(b'updating'), unit=_(b'files'), total=numupdates ) - if [a for a in actions[ACTION_REMOVE] if a[0] == '.hgsubstate']: + if [a for a in actions[ACTION_REMOVE] if a[0] == b'.hgsubstate']: subrepoutil.submerge(repo, wctx, mctx, wctx, overwrite, labels) # record path conflicts @@ -1864,16 +1873,16 @@ s = repo.ui.status s( _( - "%s: path conflict - a file or link has the same name as a " - "directory\n" + b"%s: path conflict - a file or link has the same name as a " + b"directory\n" ) % f ) - if fo == 'l': - s(_("the local file has been renamed to %s\n") % f1) + if fo == b'l': + s(_(b"the local file has been renamed to %s\n") % f1) else: - s(_("the remote file has been renamed to %s\n") % f1) - s(_("resolve manually then use 'hg resolve --mark %s'\n") % f) + s(_(b"the remote file has been renamed to %s\n") % f1) + s(_(b"resolve manually then use 'hg resolve --mark %s'\n") % f) ms.addpath(f, f1, fo) progress.increment(item=f) @@ -1891,10 +1900,10 @@ # resolve path conflicts (must come before getting) for f, args, msg in actions[ACTION_PATH_CONFLICT_RESOLVE]: - repo.ui.debug(" %s: %s -> pr\n" % (f, msg)) + repo.ui.debug(b" %s: %s -> pr\n" % (f, msg)) (f0,) = args if wctx[f0].lexists(): - repo.ui.note(_("moving %s to %s\n") % (f0, f)) + repo.ui.note(_(b"moving %s to %s\n") % (f0, f)) wctx[f].audit() wctx[f].write(wctx.filectx(f0).data(), wctx.filectx(f0).flags()) wctx[f0].remove() @@ -1902,7 +1911,7 @@ # get in parallel. threadsafe = repo.ui.configbool( - 'experimental', 'worker.wdir-get-thread-safe' + b'experimental', b'worker.wdir-get-thread-safe' ) prog = worker.worker( repo.ui, @@ -1922,35 +1931,35 @@ progress.increment(step=i, item=item) updated = len(actions[ACTION_GET]) - if [a for a in actions[ACTION_GET] if a[0] == '.hgsubstate']: + if [a for a in actions[ACTION_GET] if a[0] == b'.hgsubstate']: subrepoutil.submerge(repo, wctx, mctx, wctx, overwrite, labels) # forget (manifest only, just log it) (must come first) for f, args, msg in actions[ACTION_FORGET]: - repo.ui.debug(" %s: %s -> f\n" % (f, msg)) + repo.ui.debug(b" %s: %s -> f\n" % (f, msg)) progress.increment(item=f) # re-add (manifest only, just log it) for f, args, msg in actions[ACTION_ADD]: - repo.ui.debug(" %s: %s -> a\n" % (f, msg)) + repo.ui.debug(b" %s: %s -> a\n" % (f, msg)) progress.increment(item=f) # re-add/mark as modified (manifest only, just log it) for f, args, msg in actions[ACTION_ADD_MODIFIED]: - repo.ui.debug(" %s: %s -> am\n" % (f, msg)) + repo.ui.debug(b" %s: %s -> am\n" % (f, msg)) progress.increment(item=f) # keep (noop, just log it) for f, args, msg in actions[ACTION_KEEP]: - repo.ui.debug(" %s: %s -> k\n" % (f, msg)) + repo.ui.debug(b" %s: %s -> k\n" % (f, msg)) # no progress # directory rename, move local for f, args, msg in actions[ACTION_DIR_RENAME_MOVE_LOCAL]: - repo.ui.debug(" %s: %s -> dm\n" % (f, msg)) + repo.ui.debug(b" %s: %s -> dm\n" % (f, msg)) progress.increment(item=f) f0, flags = args - repo.ui.note(_("moving %s to %s\n") % (f0, f)) + repo.ui.note(_(b"moving %s to %s\n") % (f0, f)) wctx[f].audit() wctx[f].write(wctx.filectx(f0).data(), flags) wctx[f0].remove() @@ -1958,20 +1967,20 @@ # local directory rename, get for f, args, msg in actions[ACTION_LOCAL_DIR_RENAME_GET]: - repo.ui.debug(" %s: %s -> dg\n" % (f, msg)) + repo.ui.debug(b" %s: %s -> dg\n" % (f, msg)) progress.increment(item=f) f0, flags = args - repo.ui.note(_("getting %s to %s\n") % (f0, f)) + repo.ui.note(_(b"getting %s to %s\n") % (f0, f)) wctx[f].write(mctx.filectx(f0).data(), flags) updated += 1 # exec for f, args, msg in actions[ACTION_EXEC]: - repo.ui.debug(" %s: %s -> e\n" % (f, msg)) + repo.ui.debug(b" %s: %s -> e\n" % (f, msg)) progress.increment(item=f) (flags,) = args wctx[f].audit() - wctx[f].setflags('l' in flags, 'x' in flags) + wctx[f].setflags(b'l' in flags, b'x' in flags) updated += 1 # the ordering is important here -- ms.mergedriver will raise if the merge @@ -1982,7 +1991,7 @@ if usemergedriver: if wctx.isinmemory(): raise error.InMemoryMergeConflictsError( - "in-memory merge does not " "support mergedriver" + b"in-memory merge does not " b"support mergedriver" ) ms.commit() proceed = driverpreprocess(repo, ms, wctx, labels=labels) @@ -2004,9 +2013,9 @@ # premerge tocomplete = [] for f, args, msg in mergeactions: - repo.ui.debug(" %s: %s -> m (premerge)\n" % (f, msg)) + repo.ui.debug(b" %s: %s -> m (premerge)\n" % (f, msg)) progress.increment(item=f) - if f == '.hgsubstate': # subrepo states need updating + if f == b'.hgsubstate': # subrepo states need updating subrepoutil.submerge( repo, wctx, mctx, wctx.ancestor(mctx), overwrite, labels ) @@ -2019,7 +2028,7 @@ # merge for f, args, msg in tocomplete: - repo.ui.debug(" %s: %s -> m (merge)\n" % (f, msg)) + repo.ui.debug(b" %s: %s -> m (merge)\n" % (f, msg)) progress.increment(item=f, total=numupdates) ms.resolve(f, wctx) @@ -2082,7 +2091,7 @@ def recordupdates(repo, actions, branchmerge, getfiledata): - "record merge actions to the dirstate" + b"record merge actions to the dirstate" # remove (must come first) for f, args, msg in actions.get(ACTION_REMOVE, []): if branchmerge: @@ -2178,10 +2187,10 @@ repo.dirstate.normal(f) -UPDATECHECK_ABORT = 'abort' # handled at higher layers -UPDATECHECK_NONE = 'none' -UPDATECHECK_LINEAR = 'linear' -UPDATECHECK_NO_CONFLICT = 'noconflict' +UPDATECHECK_ABORT = b'abort' # handled at higher layers +UPDATECHECK_NONE = b'none' +UPDATECHECK_LINEAR = b'linear' +UPDATECHECK_NO_CONFLICT = b'noconflict' def update( @@ -2293,7 +2302,7 @@ if ancestor is not None: pas = [repo[ancestor]] else: - if repo.ui.configlist('merge', 'preferancestor') == ['*']: + if repo.ui.configlist(b'merge', b'preferancestor') == [b'*']: cahs = repo.changelog.commonancestorsheads(p1.node(), p2.node()) pas = [repo[anc] for anc in (sorted(cahs) or [nullid])] else: @@ -2305,31 +2314,31 @@ ### check phase if not overwrite: if len(pl) > 1: - raise error.Abort(_("outstanding uncommitted merge")) + raise error.Abort(_(b"outstanding uncommitted merge")) ms = mergestate.read(repo) if list(ms.unresolved()): raise error.Abort( - _("outstanding merge conflicts"), - hint=_("use 'hg resolve' to resolve"), + _(b"outstanding merge conflicts"), + hint=_(b"use 'hg resolve' to resolve"), ) if branchmerge: if pas == [p2]: raise error.Abort( _( - "merging with a working directory ancestor" - " has no effect" + b"merging with a working directory ancestor" + b" has no effect" ) ) elif pas == [p1]: if not mergeancestor and wc.branch() == p2.branch(): raise error.Abort( - _("nothing to merge"), - hint=_("use 'hg update' " "or check 'hg heads'"), + _(b"nothing to merge"), + hint=_(b"use 'hg update' " b"or check 'hg heads'"), ) if not force and (wc.files() or wc.deleted()): raise error.Abort( - _("uncommitted changes"), - hint=_("use 'hg status' to list changes"), + _(b"uncommitted changes"), + hint=_(b"use 'hg status' to list changes"), ) if not wc.isinmemory(): for s in sorted(wc.substate): @@ -2338,8 +2347,8 @@ elif not overwrite: if p1 == p2: # no-op update # call the hooks and exit early - repo.hook('preupdate', throw=True, parent1=xp2, parent2='') - repo.hook('update', parent1=xp2, parent2='', error=0) + repo.hook(b'preupdate', throw=True, parent1=xp2, parent2=b'') + repo.hook(b'update', parent1=xp2, parent2=b'', error=0) return updateresult(0, 0, 0, 0) if updatecheck == UPDATECHECK_LINEAR and pas not in ( @@ -2355,8 +2364,8 @@ if repo[node].node() in foreground: pass # allow updating to successors else: - msg = _("uncommitted changes") - hint = _("commit or update --clean to discard changes") + msg = _(b"uncommitted changes") + hint = _(b"commit or update --clean to discard changes") raise error.UpdateAbort(msg, hint=hint) else: # Allow jumping branches if clean and specific rev given @@ -2368,7 +2377,7 @@ pas = [p1] # deprecated config: merge.followcopies - followcopies = repo.ui.configbool('merge', 'followcopies') + followcopies = repo.ui.configbool(b'merge', b'followcopies') if overwrite: followcopies = False elif not pas[0]: @@ -2399,42 +2408,46 @@ ACTION_REMOVE, ACTION_PATH_CONFLICT_RESOLVE, ): - msg = _("conflicting changes") - hint = _("commit or update --clean to discard changes") + msg = _(b"conflicting changes") + hint = _(b"commit or update --clean to discard changes") raise error.Abort(msg, hint=hint) # Prompt and create actions. Most of this is in the resolve phase # already, but we can't handle .hgsubstate in filemerge or # subrepoutil.submerge yet so we have to keep prompting for it. - if '.hgsubstate' in actionbyfile: - f = '.hgsubstate' + if b'.hgsubstate' in actionbyfile: + f = b'.hgsubstate' m, args, msg = actionbyfile[f] prompts = filemerge.partextras(labels) - prompts['f'] = f + prompts[b'f'] = f if m == ACTION_CHANGED_DELETED: if repo.ui.promptchoice( _( - "local%(l)s changed %(f)s which other%(o)s deleted\n" - "use (c)hanged version or (d)elete?" - "$$ &Changed $$ &Delete" + b"local%(l)s changed %(f)s which other%(o)s deleted\n" + b"use (c)hanged version or (d)elete?" + b"$$ &Changed $$ &Delete" ) % prompts, 0, ): - actionbyfile[f] = (ACTION_REMOVE, None, 'prompt delete') + actionbyfile[f] = (ACTION_REMOVE, None, b'prompt delete') elif f in p1: - actionbyfile[f] = (ACTION_ADD_MODIFIED, None, 'prompt keep') + actionbyfile[f] = ( + ACTION_ADD_MODIFIED, + None, + b'prompt keep', + ) else: - actionbyfile[f] = (ACTION_ADD, None, 'prompt keep') + actionbyfile[f] = (ACTION_ADD, None, b'prompt keep') elif m == ACTION_DELETED_CHANGED: f1, f2, fa, move, anc = args flags = p2[f2].flags() if ( repo.ui.promptchoice( _( - "other%(o)s changed %(f)s which local%(l)s deleted\n" - "use (c)hanged version or leave (d)eleted?" - "$$ &Changed $$ &Deleted" + b"other%(o)s changed %(f)s which local%(l)s deleted\n" + b"use (c)hanged version or leave (d)eleted?" + b"$$ &Changed $$ &Deleted" ) % prompts, 0, @@ -2444,7 +2457,7 @@ actionbyfile[f] = ( ACTION_GET, (flags, False), - 'prompt recreating', + b'prompt recreating', ) else: del actionbyfile[f] @@ -2469,33 +2482,33 @@ for f, fl in sorted(diverge.iteritems()): repo.ui.warn( _( - "note: possible conflict - %s was renamed " - "multiple times to:\n" + b"note: possible conflict - %s was renamed " + b"multiple times to:\n" ) % f ) for nf in sorted(fl): - repo.ui.warn(" %s\n" % nf) + repo.ui.warn(b" %s\n" % nf) # rename and delete for f, fl in sorted(renamedelete.iteritems()): repo.ui.warn( _( - "note: possible conflict - %s was deleted " - "and renamed to:\n" + b"note: possible conflict - %s was deleted " + b"and renamed to:\n" ) % f ) for nf in sorted(fl): - repo.ui.warn(" %s\n" % nf) + repo.ui.warn(b" %s\n" % nf) ### apply phase if not branchmerge: # just jump to the new rev - fp1, fp2, xp1, xp2 = fp2, nullid, xp2, '' + fp1, fp2, xp1, xp2 = fp2, nullid, xp2, b'' if not partial and not wc.isinmemory(): - repo.hook('preupdate', throw=True, parent1=xp1, parent2=xp2) + repo.hook(b'preupdate', throw=True, parent1=xp1, parent2=xp2) # note that we're in the middle of an update - repo.vfs.write('updatestate', p2.hex()) + repo.vfs.write(b'updatestate', p2.hex()) # Advertise fsmonitor when its presence could be useful. # @@ -2507,16 +2520,16 @@ # # We only allow on Linux and MacOS because that's where fsmonitor is # considered stable. - fsmonitorwarning = repo.ui.configbool('fsmonitor', 'warn_when_unused') + fsmonitorwarning = repo.ui.configbool(b'fsmonitor', b'warn_when_unused') fsmonitorthreshold = repo.ui.configint( - 'fsmonitor', 'warn_update_file_count' + b'fsmonitor', b'warn_update_file_count' ) try: # avoid cycle: extensions -> cmdutil -> merge from . import extensions - extensions.find('fsmonitor') - fsmonitorenabled = repo.ui.config('fsmonitor', 'mode') != 'off' + extensions.find(b'fsmonitor') + fsmonitorenabled = repo.ui.config(b'fsmonitor', b'mode') != b'off' # We intentionally don't look at whether fsmonitor has disabled # itself because a) fsmonitor may have already printed a warning # b) we only care about the config state here. @@ -2528,13 +2541,13 @@ and not fsmonitorenabled and p1.node() == nullid and len(actions[ACTION_GET]) >= fsmonitorthreshold - and pycompat.sysplatform.startswith(('linux', 'darwin')) + and pycompat.sysplatform.startswith((b'linux', b'darwin')) ): repo.ui.warn( _( - '(warning: large working directory being used without ' - 'fsmonitor enabled; enable fsmonitor to improve performance; ' - 'see "hg help -e fsmonitor")\n' + b'(warning: large working directory being used without ' + b'fsmonitor enabled; enable fsmonitor to improve performance; ' + b'see "hg help -e fsmonitor")\n' ) ) @@ -2549,7 +2562,7 @@ repo.setparents(fp1, fp2) recordupdates(repo, actions, branchmerge, getfiledata) # update completed, clear state - util.unlink(repo.vfs.join('updatestate')) + util.unlink(repo.vfs.join(b'updatestate')) if not branchmerge: repo.dirstate.setbranch(p2.branch()) @@ -2561,7 +2574,7 @@ if not partial: repo.hook( - 'update', parent1=xp1, parent2=xp2, error=stats.unresolvedcount + b'update', parent1=xp1, parent2=xp2, error=stats.unresolvedcount ) return stats @@ -2590,7 +2603,7 @@ # to copy commits), and 2) informs update that the incoming changes are # newer than the destination so it doesn't prompt about "remote changed foo # which local deleted". - mergeancestor = repo.changelog.isancestor(repo['.'].node(), ctx.node()) + mergeancestor = repo.changelog.isancestor(repo[b'.'].node(), ctx.node()) stats = update( repo, @@ -2612,7 +2625,7 @@ pother = parents[0].node() with repo.dirstate.parentchange(): - repo.setparents(repo['.'].node(), pother) + repo.setparents(repo[b'.'].node(), pother) repo.dirstate.write(repo.currenttransaction()) # fix up dirstate for copies and renames copies.duplicatecopies(repo, repo[None], ctx.rev(), pctx.rev()) @@ -2653,11 +2666,11 @@ try: removefn(path) except OSError: - m = _('%s cannot be removed') % path + m = _(b'%s cannot be removed') % path if abortonerror: raise error.Abort(m) else: - repo.ui.warn(_('warning: %s\n') % m) + repo.ui.warn(_(b'warning: %s\n') % m) # There's no API to copy a matcher. So mutate the passed matcher and # restore it when we're done. @@ -2676,7 +2689,7 @@ if removefiles: for f in sorted(status.unknown + status.ignored): if not noop: - repo.ui.note(_('removing file %s\n') % f) + repo.ui.note(_(b'removing file %s\n') % f) remove(repo.wvfs.unlink, f) res.append(f) @@ -2684,7 +2697,7 @@ for f in sorted(directories, reverse=True): if matcher(f) and not repo.wvfs.listdir(f): if not noop: - repo.ui.note(_('removing directory %s\n') % f) + repo.ui.note(_(b'removing directory %s\n') % f) remove(repo.wvfs.rmdir, f) res.append(f)