# HG changeset patch # User FUJIWARA Katsunori # Date 2014-04-15 15:37:24 # Node ID 32b3331f18ebdeb1b95eebf5b5c767deadca2535 # Parent a2cc3c08c3ac39f7d2481760fe96522419dced6d largefiles: centralize the logic to get outgoing largefiles Before this patch, "overrides.getoutgoinglfiles()" (called by "overrideoutgoing()" and "overridesummary()") and "lfilesrepo.push()" implement similar logic to get outgoing largefiles separately. This patch centralizes the logic to get outgoing largefiles in "lfutil.getlfilestoupload()". "lfutil.getlfilestoupload()" takes "addfunc" argument, because each callers need different information (and it is useful for enhancement in the future). - "overrides.getoutgoinglfiles()" needs only filenames - "lfilesrepo.push()" needs only hashes of largefiles diff --git a/hgext/largefiles/lfutil.py b/hgext/largefiles/lfutil.py --- a/hgext/largefiles/lfutil.py +++ b/hgext/largefiles/lfutil.py @@ -15,6 +15,7 @@ import stat from mercurial import dirstate, httpconnection, match as match_, util, scmutil from mercurial.i18n import _ +from mercurial import node shortname = '.hglf' shortnameslash = shortname + '/' @@ -365,3 +366,25 @@ def getlfilestoupdate(oldstandins, newst if f[0] not in filelist: filelist.append(f[0]) return filelist + +def getlfilestoupload(repo, missing, addfunc): + for n in missing: + parents = [p for p in repo.changelog.parents(n) if p != node.nullid] + ctx = repo[n] + files = set(ctx.files()) + if len(parents) == 2: + mc = ctx.manifest() + mp1 = ctx.parents()[0].manifest() + mp2 = ctx.parents()[1].manifest() + for f in mp1: + if f not in mc: + files.add(f) + for f in mp2: + if f not in mc: + files.add(f) + for f in mc: + if mc[f] != mp1.get(f, None) or mc[f] != mp2.get(f, None): + files.add(f) + for fn in files: + if isstandin(fn) and fn in ctx: + addfunc(fn, ctx[fn].data().strip()) diff --git a/hgext/largefiles/overrides.py b/hgext/largefiles/overrides.py --- a/hgext/largefiles/overrides.py +++ b/hgext/largefiles/overrides.py @@ -12,7 +12,7 @@ import os import copy from mercurial import hg, commands, util, cmdutil, scmutil, match as match_, \ - node, archival, error, merge, discovery, pathutil, revset + archival, error, merge, discovery, pathutil, revset from mercurial.i18n import _ from mercurial.node import hex from hgext import rebase @@ -1002,25 +1002,7 @@ def getoutgoinglfiles(ui, repo, dest=Non o.reverse() toupload = set() - for n in o: - parents = [p for p in repo.changelog.parents(n) if p != node.nullid] - ctx = repo[n] - files = set(ctx.files()) - if len(parents) == 2: - mc = ctx.manifest() - mp1 = ctx.parents()[0].manifest() - mp2 = ctx.parents()[1].manifest() - for f in mp1: - if f not in mc: - files.add(f) - for f in mp2: - if f not in mc: - files.add(f) - for f in mc: - if mc[f] != mp1.get(f, None) or mc[f] != mp2.get(f, None): - files.add(f) - toupload = toupload.union( - set([f for f in files if lfutil.isstandin(f) and f in ctx])) + lfutil.getlfilestoupload(repo, o, lambda fn, lfhash: toupload.add(fn)) return sorted(toupload) def overrideoutgoing(orig, ui, repo, dest=None, **opts): diff --git a/hgext/largefiles/reposetup.py b/hgext/largefiles/reposetup.py --- a/hgext/largefiles/reposetup.py +++ b/hgext/largefiles/reposetup.py @@ -11,7 +11,6 @@ import copy import os from mercurial import error, manifest, match as match_, util, discovery -from mercurial import node as node_ from mercurial.i18n import _ from mercurial import localrepo @@ -419,30 +418,8 @@ def reposetup(ui, repo): if outgoing.missing: toupload = set() o = self.changelog.nodesbetween(outgoing.missing, revs)[0] - for n in o: - parents = [p for p in self.changelog.parents(n) - if p != node_.nullid] - ctx = self[n] - files = set(ctx.files()) - if len(parents) == 2: - mc = ctx.manifest() - mp1 = ctx.parents()[0].manifest() - mp2 = ctx.parents()[1].manifest() - for f in mp1: - if f not in mc: - files.add(f) - for f in mp2: - if f not in mc: - files.add(f) - for f in mc: - if mc[f] != mp1.get(f, None) or mc[f] != mp2.get(f, - None): - files.add(f) - - toupload = toupload.union( - set([ctx[f].data().strip() - for f in files - if lfutil.isstandin(f) and f in ctx])) + addfunc = lambda fn, lfhash: toupload.add(lfhash) + lfutil.getlfilestoupload(self, o, addfunc) lfcommands.uploadlfiles(ui, self, remote, toupload) return super(lfilesrepo, self).push(remote, force=force, revs=revs, newbranch=newbranch)