# HG changeset patch # User Sean Farley # Date 1429137066 14400 # Node ID 4288d2de3cbfee6f3b14e4cb5b8b5c833ebfae78 # Parent 4d67686c0e64cd4468022948b90fd61847c9f7ef git_handler: whitespace and formating changes All errors found with flake8. diff --git a/hggit/git_handler.py b/hggit/git_handler.py --- a/hggit/git_handler.py +++ b/hggit/git_handler.py @@ -112,7 +112,8 @@ self.paths = ui.configitems('paths') - self.branch_bookmark_suffix = ui.config('git', 'branch_bookmark_suffix') + self.branch_bookmark_suffix = ui.config('git', + 'branch_bookmark_suffix') self._map_git_real = None self._map_hg_real = None @@ -121,15 +122,15 @@ @property def _map_git(self): - if self._map_git_real is None: - self.load_map() - return self._map_git_real + if self._map_git_real is None: + self.load_map() + return self._map_git_real @property def _map_hg(self): - if self._map_hg_real is None: - self.load_map() - return self._map_hg_real + if self._map_hg_real is None: + self.load_map() + return self._map_hg_real @property def remote_refs(self): @@ -157,7 +158,7 @@ from_, to = RE_AUTHOR_FILE.split(line, 2) self.author_map[from_] = to - ## FILE LOAD AND SAVE METHODS + # FILE LOAD AND SAVE METHODS def map_set(self, gitsha, hgsha): self._map_git[gitsha] = hgsha @@ -229,9 +230,9 @@ # If this complains, atomictempfile no longer has close file.close() - ## END FILE LOAD AND SAVE METHODS + # END FILE LOAD AND SAVE METHODS - ## COMMANDS METHODS + # COMMANDS METHODS def import_commits(self, remote_name): refs = self.git.refs.as_dict() @@ -260,7 +261,7 @@ # "Activate" a tipmost bookmark. bms = getattr(self.repo['tip'], 'bookmarks', - lambda : None)() + lambda: None)() if bms: bookmarks.setcurrent(self.repo, bms[0]) @@ -296,11 +297,12 @@ client, path = self.get_transport_and_path(remote) old_refs = {} new_refs = {} + def changed(refs): old_refs.update(refs) exportable = self.get_exportable() new_refs.update(self.get_changed_refs(refs, exportable, True)) - return refs # always return the same refs to make the send a no-op + return refs # always return the same refs to make the send a no-op try: client.send_pack(path, changed, lambda have, want: []) @@ -329,18 +331,18 @@ if old_sha is None: if self.ui.verbose: self.ui.note("adding reference %s::%s => GIT:%s\n" % - (remote_name, ref, new_sha[0:8])) + (remote_name, ref, new_sha[0:8])) else: self.ui.status("adding reference %s\n" % ref) elif new_sha != old_sha: if self.ui.verbose: self.ui.note("updating reference %s::%s => GIT:%s\n" % - (remote_name, ref, new_sha[0:8])) + (remote_name, ref, new_sha[0:8])) else: self.ui.status("updating reference %s\n" % ref) else: self.ui.debug("unchanged reference %s::%s => GIT:%s\n" % - (remote_name, ref, new_sha[0:8])) + (remote_name, ref, new_sha[0:8])) self.update_remote_branches(remote_name, new_refs) if old_refs == new_refs: @@ -387,13 +389,14 @@ return (b, commits, lambda: None) - ## CHANGESET CONVERSION METHODS + # CHANGESET CONVERSION METHODS def export_git_objects(self): repo = self.repo clnode = repo.changelog.node nodes = (clnode(n) for n in repo) - export = (repo[node] for node in nodes if not hex(node) in self._map_hg) + export = (repo[node] for node in nodes if not hex(node) in + self._map_hg) export = [ctx for ctx in export if ctx.extra().get('hg-git', None) != 'octopus'] total = len(export) @@ -429,7 +432,6 @@ self.export_hg_commit(ctx.node(), exporter) self.ui.progress('exporting', None, total=total) - # convert this commit into git objects # go through the manifest, convert all blobs/trees we don't have # write the commit object (with metadata info) @@ -461,7 +463,7 @@ commit.commit_time = timestamp # work around a timezone format change - if int(timezone) % 60 != 0: #pragma: no cover + if int(timezone) % 60 != 0: # pragma: no cover timezone = parse_timezone(timezone) # Newer versions of Dulwich return a tuple here if isinstance(timezone, tuple): @@ -500,7 +502,7 @@ if tree_sha not in self.git.object_store: raise hgutil.Abort(_('Tree SHA-1 not present in Git repo: %s' % - tree_sha)) + tree_sha)) commit.tree = tree_sha @@ -572,9 +574,13 @@ email = self.get_valid_git_username_email(a.group(2)) if a.group(3) != None and len(a.group(3)) != 0: name += ' ext:(' + urllib.quote(a.group(3)) + ')' - author = self.get_valid_git_username_email(name) + ' <' + self.get_valid_git_username_email(email) + '>' + author = '%s <%s>' \ + % (self.get_valid_git_username_email(name), + self.get_valid_git_username_email(email)) elif '@' in author: - author = self.get_valid_git_username_email(author) + ' <' + self.get_valid_git_username_email(author) + '>' + author = '%s <%s>' \ + % (self.get_valid_git_username_email(author), + self.get_valid_git_username_email(author)) else: author = self.get_valid_git_username_email(author) + ' ' @@ -585,7 +591,8 @@ def get_git_parents(self, ctx): def is_octopus_part(ctx): - return ctx.extra().get('hg-git', None) in ('octopus', 'octopus-done') + olist = ('octopus', 'octopus-done') + return ctx.extra().get('hg-git', None) in olist parents = [] if ctx.extra().get('hg-git', None) == 'octopus-done': @@ -671,8 +678,8 @@ if extra_message: message += "\n--HG--\n" + extra_message - if (extra.get('hg-git-rename-source', None) != 'git' - and not extra_in_message and not git_extra and extra_message == ''): + if (extra.get('hg-git-rename-source', None) != 'git' and not + extra_in_message and not git_extra and extra_message == ''): # We need to store this if no other metadata is stored. This # indicates that when reimporting the commit into Mercurial we'll # know not to detect renames. @@ -746,7 +753,8 @@ if gparents: p1ctx = self.repo.changectx(gparents[0]) if '.hgsubstate' in p1ctx: - parentsubdata = p1ctx.filectx('.hgsubstate').data().splitlines() + parentsubdata = p1ctx.filectx('.hgsubstate').data() + parentsubdata = parentsubdata.splitlines() parentsubstate = util.parse_hgsubstate(parentsubdata) for path, sha in parentsubstate.iteritems(): hgsubstate[path] = sha @@ -766,11 +774,13 @@ hgsub = None gitmodules = self.parse_gitmodules(git_commit_tree) if gitmodules: - hgsub = util.parse_hgsub(self.git_file_readlines(git_commit_tree, '.hgsub')) + hgsub = util.parse_hgsub(self.git_file_readlines(git_commit_tree, + '.hgsub')) for (sm_path, sm_url, sm_name) in gitmodules: hgsub[sm_path] = '[git]' + sm_url files['.hgsub'] = (False, 0100644, None) - elif commit.parents and '.gitmodules' in self.git[self.git[commit.parents[0]].tree]: + elif (commit.parents and '.gitmodules' in + self.git[self.git[commit.parents[0]].tree]): # no .gitmodules in this commit, however present in the parent # mark its hg counterpart as deleted (assuming .hgsub is there # due to the same import_git_commit process @@ -787,7 +797,7 @@ text = '\n'.join([l.rstrip() for l in text.splitlines()]).strip('\n') if text + '\n' != origtext: - extra['message'] = create_delta(text +'\n', origtext) + extra['message'] = create_delta(text + '\n', origtext) author = commit.author @@ -824,12 +834,12 @@ return [] manifest1 = self.repo.changectx(p1).manifest() manifest2 = self.repo.changectx(p2).manifest() - return [path for path, node1 in manifest1.iteritems() - if path not in files and manifest2.get(path, node1) != node1] + return [path for path, node1 in manifest1.iteritems() if path not + in files and manifest2.get(path, node1) != node1] def getfilectx(repo, memctx, f): info = files.get(f) - if info != None: + if info is not None: # it's a file reported as modified from Git delete, mode, sha = info if delete: @@ -838,7 +848,7 @@ else: # Mercurial < 3.2 raise IOError - if not sha: # indicates there's no git counterpart + if not sha: # indicates there's no git counterpart e = '' copied_path = None if '.hgsubstate' == f: @@ -873,9 +883,9 @@ if len(gparents) > 1: # merge, possibly octopus def commit_octopus(p1, p2): - ctx = context.memctx(self.repo, (p1, p2), text, - list(files) + findconvergedfiles(p1, p2), - getfilectx, author, date, {'hg-git': 'octopus'}) + ctx = context.memctx(self.repo, (p1, p2), text, list(files) + + findconvergedfiles(p1, p2), getfilectx, + author, date, {'hg-git': 'octopus'}) # See comment below about setting substate to None. ctx.substate = None return hex(self.repo.commitctx(ctx)) @@ -902,8 +912,8 @@ # if committer is different than author, add it to extra if commit.author != commit.committer \ - or commit.author_time != commit.commit_time \ - or commit.author_timezone != commit.commit_timezone: + or commit.author_time != commit.commit_time \ + or commit.author_timezone != commit.commit_timezone: extra['committer'] = "%s %d %d" % ( commit.committer, commit.commit_time, -commit.commit_timezone) @@ -911,7 +921,7 @@ extra['encoding'] = commit.encoding if octopus: - extra['hg-git'] ='octopus-done' + extra['hg-git'] = 'octopus-done' ctx = context.memctx(self.repo, (p1, p2), text, list(files) + findconvergedfiles(p1, p2), @@ -920,8 +930,8 @@ # committablectx. This means that it has a 'substate' property that # contains the subrepo state. Ordinarily, Mercurial expects the subrepo # to be present while making a new commit -- since hg-git is importing - # purely in-memory commits without backing stores for the subrepos, that - # won't work. Forcibly set the substate to None so that there's no + # purely in-memory commits without backing stores for the subrepos, + # that won't work. Forcibly set the substate to None so that there's no # attempt to read subrepos. ctx.substate = None node = self.repo.commitctx(ctx) @@ -932,7 +942,7 @@ cs = hex(node) self.map_set(commit.id, cs) - ## PACK UPLOADING AND FETCHING + # PACK UPLOADING AND FETCHING def upload_pack(self, remote, revs, force): client, path = self.get_transport_and_path(remote) @@ -988,7 +998,8 @@ def get_changed_refs(self, refs, exportable, force): new_refs = refs.copy() - #The remote repo is empty and the local one doesn't have bookmarks/tags + # The remote repo is empty and the local one doesn't have + # bookmarks/tags # # (older dulwich versions return the proto-level # capabilities^{} key when the dict should have been @@ -1002,9 +1013,11 @@ del new_refs['capabilities^{}'] tip = hex(tip) try: - commands.bookmark(self.ui, self.repo, 'master', rev=tip, force=True) + commands.bookmark(self.ui, self.repo, 'master', + rev=tip, force=True) except NameError: - bookmarks.bookmark(self.ui, self.repo, 'master', rev=tip, force=True) + bookmarks.bookmark(self.ui, self.repo, 'master', + rev=tip, force=True) bookmarks.setcurrent(self.repo, 'master') new_refs['refs/heads/master'] = self.map_git_get(tip) @@ -1015,8 +1028,8 @@ " it doesn't have a ref" % ctx) # Check if the tags the server is advertising are annotated tags, - # by attempting to retrieve it from the our git repo, and building a - # list of these tags. + # by attempting to retrieve it from the our git repo, and building + # a list of these tags. # # This is possible, even though (currently) annotated tags are # dereferenced and stored as lightweight ones, as the annotated tag @@ -1024,7 +1037,7 @@ uptodate_annotated_tags = [] for ref in rev_refs.tags: # Check tag. - if not ref in refs: + if ref not in refs: continue try: # We're not using Repo.tag(), as it's deprecated. @@ -1068,10 +1081,11 @@ try: progress = GitProgress(self.ui) f = StringIO.StringIO() - ret = client.fetch_pack(path, determine_wants, graphwalker, f.write, progress.progress) + ret = client.fetch_pack(path, determine_wants, graphwalker, + f.write, progress.progress) if(f.pos != 0): f.seek(0) - po = self.git.object_store.add_thin_pack(f.read, None) + po = self.git.object_store.add_thin_pack(f.read, None) progress.flush() # For empty repos dulwich gives us None, but since later @@ -1081,7 +1095,7 @@ except (HangupException, GitProtocolError), e: raise hgutil.Abort(_("git remote error: ") + str(e)) - ## REFERENCES HANDLING + # REFERENCES HANDLING def filter_refs(self, refs, heads): '''For a dictionary of refs: shas, if heads is None then return refs @@ -1092,9 +1106,8 @@ if heads is not None: # contains pairs of ('refs/(heads|tags|...)/foo', 'foo') # if ref is just '', then we get ('foo', 'foo') - stripped_refs = [ - (r, r[r.find('/', r.find('/')+1)+1:]) - for r in refs] + stripped_refs = [(r, r[r.find('/', r.find('/') + 1) + 1:]) for r in + refs] for h in heads: if h.endswith('/*'): prefix = h[:-1] # include the / but not the * @@ -1105,22 +1118,24 @@ else: r = [pair[0] for pair in stripped_refs if pair[1] == h] if not r: - raise hgutil.Abort("ref %s not found on remote server" % h) + raise hgutil.Abort("ref %s not found on remote server" + % h) elif len(r) == 1: filteredrefs.append(r[0]) else: - raise hgutil.Abort("ambiguous reference %s: %r" % (h, r)) + raise hgutil.Abort("ambiguous reference %s: %r" + % (h, r)) else: for ref, sha in refs.iteritems(): - if (not ref.endswith('^{}') - and (ref.startswith('refs/heads/') - or ref.startswith('refs/tags/'))): + if (not ref.endswith('^{}') and + (ref.startswith('refs/heads/') or + ref.startswith('refs/tags/'))): filteredrefs.append(ref) filteredrefs.sort() - # the choice of OrderedDict vs plain dict has no impact on stock hg-git, - # but allows extensions to customize the order in which refs are - # returned + # the choice of OrderedDict vs plain dict has no impact on stock + # hg-git, but allows extensions to customize the order in which refs + # are returned return util.OrderedDict((r, refs[r]) for r in filteredrefs) def filter_min_date(self, refs): @@ -1133,6 +1148,7 @@ # filter refs older than min_timestamp min_timestamp, min_offset = hgutil.parsedate(min_date) + def check_min_time(obj): if isinstance(obj, Tag): return obj.tag_time >= min_timestamp @@ -1160,12 +1176,12 @@ if target is not None: tag_refname = 'refs/tags/' + tag if(check_ref_format(tag_refname)): - self.git.refs[tag_refname] = target - self.tags[tag] = hex(sha) + self.git.refs[tag_refname] = target + self.tags[tag] = hex(sha) else: - self.repo.ui.warn( - 'Skipping export of tag %s because it ' - 'has invalid name as a git refname.\n' % tag) + self.repo.ui.warn('Skipping export of tag %s because ' + 'it has invalid name as a git ' + 'refname.\n' % tag) else: self.repo.ui.warn( 'Skipping export of tag %s because it ' @@ -1187,8 +1203,10 @@ def __init__(self): self.heads = set() self.tags = set() + def __iter__(self): return itertools.chain(self.heads, self.tags) + def __nonzero__(self): return bool(self.heads) or bool(self.tags) @@ -1217,17 +1235,17 @@ continue if ref_name[-3:] == '^{}': ref_name = ref_name[:-3] - if not ref_name in repotags: + if ref_name not in repotags: obj = self.git.get_object(refs[k]) sha = None - if isinstance (obj, Commit): # lightweight + if isinstance(obj, Commit): # lightweight sha = self.map_hg_get(refs[k]) if sha is not None: self.tags[ref_name] = sha - elif isinstance (obj, Tag): # annotated + elif isinstance(obj, Tag): # annotated (obj_type, obj_sha) = obj.object obj = self.git.get_object(obj_sha) - if isinstance (obj, Commit): + if isinstance(obj, Commit): sha = self.map_hg_get(obj_sha) # TODO: better handling for annotated tags if sha is not None: @@ -1242,7 +1260,7 @@ else: bms = self.repo._bookmarks - heads = dict([(ref[11:],refs[ref]) for ref in refs + heads = dict([(ref[11:], refs[ref]) for ref in refs if ref.startswith('refs/heads/')]) suffix = self.branch_bookmark_suffix or '' @@ -1253,7 +1271,7 @@ if hgsha is None: continue hgsha = bin(hgsha) - if not head in bms: + if head not in bms: # new branch bms[head + suffix] = hgsha else: @@ -1267,9 +1285,9 @@ bookmarks.write(self.repo, bms) else: self.repo._bookmarks = bms - if getattr(bms, 'write', None): # hg >= 2.5 + if getattr(bms, 'write', None): # hg >= 2.5 bms.write() - else: # hg < 2.5 + else: # hg < 2.5 bookmarks.write(self.repo) except AttributeError: @@ -1295,20 +1313,21 @@ # TODO(durin42): what is this doing? new_ref = 'refs/remotes/%s/%s' % (remote_name, head) self.git.refs[new_ref] = sha - elif (ref_name.startswith('refs/tags') - and not ref_name.endswith('^{}')): + elif (ref_name.startswith('refs/tags') and not + ref_name.endswith('^{}')): self.git.refs[ref_name] = sha self.save_remote_refs() - ## UTILITY FUNCTIONS + # UTILITY FUNCTIONS def convert_git_int_mode(self, mode): # TODO: make these into constants convert = { - 0100644: '', - 0100755: 'x', - 0120000: 'l'} + 0100644: '', + 0100755: 'x', + 0120000: 'l' + } if mode in convert: return convert[mode] return '' @@ -1319,7 +1338,7 @@ for part in parts: (mode, sha) = otree[part] obj = self.git.get_object(sha) - if isinstance (obj, Blob): + if isinstance(obj, Blob): return (mode, sha, obj._text) elif isinstance(obj, Tree): otree = obj @@ -1339,8 +1358,8 @@ renames = {} rename_detector = self._rename_detector - # this set is unused if rename detection isn't enabled -- that makes the - # code below simpler + # this set is unused if rename detection isn't enabled -- that makes + # the code below simpler renamed_out = set() changes = diff_tree.tree_changes(self.git.object_store, btree, tree, @@ -1349,8 +1368,8 @@ for change in changes: oldfile, oldmode, oldsha = change.old newfile, newmode, newsha = change.new - # actions are described by the following table ('no' means 'does not - # exist'): + # actions are described by the following table ('no' means 'does + # not exist'): # old new | action # no file | record file # no gitlink | record gitlink @@ -1363,26 +1382,24 @@ # # There's an edge case here -- symlink <-> regular file transitions # are returned by dulwich as separate deletes and adds, not - # modifications. The order of those results is unspecified and could - # be either way round. Handle both cases: - # delete first, then add -- delete stored in 'old = file' case, then - # overwritten by 'new = file' case. - # add first, then delete -- record stored in 'new = file' case, then - # membership check fails in 'old = file' case so is not overwritten - # there. - # This is not an issue for gitlink <-> {symlink, regular file} - # transitions because they write to separate dictionaries. + # modifications. The order of those results is unspecified and + # could be either way round. Handle both cases: delete first, then + # add -- delete stored in 'old = file' case, then overwritten by + # 'new = file' case. add first, then delete -- record stored in + # 'new = file' case, then membership check fails in 'old = file' + # case so is not overwritten there. This is not an issue for + # gitlink <-> {symlink, regular file} transitions because they + # write to separate dictionaries. # - # There's a similar edge case when rename detection is enabled: if a - # file is renamed and then replaced by a symlink (typically to the - # new location), it is returned by dulwich as an add and a + # There's a similar edge case when rename detection is enabled: if + # a file is renamed and then replaced by a symlink (typically to + # the new location), it is returned by dulwich as an add and a # rename. The order of those results is unspecified. Handle both - # cases: - # rename first, then add -- delete stored in 'new = file' case with - # renamed_out, then renamed_out check passes in 'old = file' case so - # is overwritten. - # add first, then rename -- add stored in 'old = file' case, then - # membership check fails in 'new = file' case so is overwritten. + # cases: rename first, then add -- delete stored in 'new = file' + # case with renamed_out, then renamed_out check passes in 'old = + # file' case so is overwritten. add first, then rename -- add + # stored in 'old = file' case, then membership check fails in 'new + # = file' case so is overwritten. if newmode == 0160000: # new = gitlink gitlinks[newfile] = newsha @@ -1438,8 +1455,9 @@ find_copies_harder = self.ui.configbool('git', 'findcopiesharder', default=False) return diff_tree.RenameDetector(self.git.object_store, - rename_threshold=similarity, max_files=max_files, - find_copies_harder=find_copies_harder) + rename_threshold=similarity, + max_files=max_files, + find_copies_harder=find_copies_harder) def parse_gitmodules(self, tree_obj): """Parse .gitmodules from a git tree specified by tree_obj @@ -1450,7 +1468,7 @@ """ rv = [] try: - unused_mode,gitmodules_sha = tree_obj['.gitmodules'] + unused_mode, gitmodules_sha = tree_obj['.gitmodules'] except KeyError: return rv gitmodules_content = self.git[gitmodules_sha].data @@ -1460,7 +1478,7 @@ section_kind, section_name = section if section_kind == 'submodule': sm_path = tt.get(section, 'path') - sm_url = tt.get(section, 'url') + sm_url = tt.get(section, 'url') rv.append((sm_path, sm_url, section_name)) return rv @@ -1512,8 +1530,11 @@ git_match = RE_GIT_URI.match(uri) if git_match: res = git_match.groupdict() - transport = client.SSHGitClient if 'ssh' in res['scheme'] else client.TCPGitClient - host, port, sepr, path = res['host'], res['port'], res['sepr'], res['path'] + transport = client.TCPGitClient + if 'ssh' in res['scheme']: + transport = client.SSHGitClient + host, port, sepr = res['host'], res['port'], res['sepr'] + path = res['path'] if sepr == '/' and not path.startswith('~'): path = '/' + path # strip trailing slash for heroku-style URLs @@ -1529,17 +1550,17 @@ uri = uri[4:] if uri.startswith('http://') or uri.startswith('https://'): - auth_handler = urllib2.HTTPBasicAuthHandler(url.passwordmgr(self.ui)) - opener = urllib2.build_opener(auth_handler) - useragent = 'git/20x6 (hg-git ; uses dulwich and hg ; like git-core)' - opener.addheaders = [('User-Agent', useragent)] + auth = urllib2.HTTPBasicAuthHandler(url.passwordmgr(self.ui)) + opener = urllib2.build_opener(auth) + ua = 'git/20x6 (hg-git ; uses dulwich and hg ; like git-core)' + opener.addheaders = [('User-Agent', ua)] try: return client.HttpGitClient(uri, opener=opener), uri except TypeError as e: if e.message.find("unexpected keyword argument 'opener'") >= 0: - # Dulwich 0.9.4, which is the latest version that ships with - # Ubuntu 14.04, doesn't support the 'opener' keyword. Try - # without authentication. + # Dulwich 0.9.4, which is the latest version that ships + # with Ubuntu 14.04, doesn't support the 'opener' keyword. + # Try without authentication. return client.HttpGitClient(uri), uri else: raise