hg
changeset 34 8708c75da2ac
parent 33 98633e60067c
child 38 ed1d3e3ca8e0
equal deleted inserted replaced
33:98633e60067c 34:8708c75da2ac
    44     for f in files:
    44     for f in files:
    45         if f[-1] != os.sep: f += os.sep
    45         if f[-1] != os.sep: f += os.sep
    46         l += [ x for x in list if x.startswith(f) ]
    46         l += [ x for x in list if x.startswith(f) ]
    47     return l
    47     return l
    48 
    48 
       
    49 def diff(files = None, node1 = None, node2 = None):
       
    50 
       
    51     if node2:
       
    52         change = repo.changelog.read(node2)
       
    53         mmap2 = repo.manifest.read(change[0])
       
    54         (c, a, d) = repo.diffrevs(node1, node2)
       
    55         def read(f): return repo.file(f).read(mmap2[f])
       
    56     else:
       
    57         if not node1:
       
    58             node1 = repo.current
       
    59         (c, a, d) = repo.diffdir(repo.root, node1)
       
    60         def read(f): return file(f).read()
       
    61 
       
    62     change = repo.changelog.read(node1)
       
    63     mmap = repo.manifest.read(change[0])
       
    64 
       
    65     if files:
       
    66         (c, a, d) = map(lambda x: filterfiles(x, files), (c, a, d))
       
    67 
       
    68     for f in c:
       
    69         to = repo.file(f).read(mmap[f])
       
    70         tn = read(f)
       
    71         sys.stdout.write(mdiff.unidiff(to, tn, f))
       
    72     for f in a:
       
    73         to = ""
       
    74         tn = read(f)
       
    75         sys.stdout.write(mdiff.unidiff(to, tn, f))
       
    76     for f in d:
       
    77         to = repo.file(f).read(mmap[f])
       
    78         tn = ""
       
    79         sys.stdout.write(mdiff.unidiff(to, tn, f))
       
    80     
       
    81 
    49 options = {}
    82 options = {}
    50 opts = [('v', 'verbose', None, 'verbose'),
    83 opts = [('v', 'verbose', None, 'verbose'),
    51         ('d', 'debug', None, 'debug')]
    84         ('d', 'debug', None, 'debug')]
    52 
    85 
    53 args = fancyopts.fancyopts(sys.argv[1:], opts, options,
    86 args = fancyopts.fancyopts(sys.argv[1:], opts, options,
   125     for f in a: print "?", f
   158     for f in a: print "?", f
   126     for f in d: print "R", f
   159     for f in d: print "R", f
   127 
   160 
   128 elif cmd == "diff":
   161 elif cmd == "diff":
   129     doptions = {}
   162     doptions = {}
   130     revs = [repo.current]
   163     revs = []
   131 
   164 
   132     if args:
   165     if args:
   133         opts = [('r', 'revision', [], 'revision')]
   166         opts = [('r', 'revision', [], 'revision')]
   134         args = fancyopts.fancyopts(args, opts, doptions,
   167         args = fancyopts.fancyopts(args, opts, doptions,
   135                                    'hg diff [options] [files]')
   168                                    'hg diff [options] [files]')
   137         revs = [hg.bin(x) for x in doptions['revision']]
   170         revs = [hg.bin(x) for x in doptions['revision']]
   138     
   171     
   139     if len(revs) > 2:
   172     if len(revs) > 2:
   140         print "too many revisions to diff"
   173         print "too many revisions to diff"
   141         sys.exit(1)
   174         sys.exit(1)
   142     elif len(revs) == 2:
   175     else:
   143         change = repo.changelog.read(revs[1])
   176         diff(args, *revs)
   144         mmap2 = repo.manifest.read(change[0])
   177 
   145         (c, a, d) = repo.diffrevs(revs[0], revs[1])
   178 elif cmd == "export":
   146         def read(f): return repo.file(f).read(mmap2[f])
   179     node = hg.bin(args[0])
   147     else:
   180     prev = repo.changelog.parents(node)[0]
   148         if len(revs) < 1:
   181     diff(None, prev, node)
   149             if not repo.current:
       
   150                 sys.exit(0)
       
   151         (c, a, d) = repo.diffdir(repo.root, revs[0])
       
   152         def read(f): return file(f).read()
       
   153 
       
   154     change = repo.changelog.read(revs[0])
       
   155     mmap = repo.manifest.read(change[0])
       
   156 
       
   157     if args:
       
   158         c = filterfiles(c, args)
       
   159         a = filterfiles(a, args)
       
   160         d = filterfiles(d, args)
       
   161 
       
   162     for f in c:
       
   163         to = repo.file(f).read(mmap[f])
       
   164         tn = read(f)
       
   165         sys.stdout.write(mdiff.unidiff(to, tn, f))
       
   166     for f in a:
       
   167         to = ""
       
   168         tn = read(f)
       
   169         sys.stdout.write(mdiff.unidiff(to, tn, f))
       
   170     for f in d:
       
   171         to = repo.file(f).read(mmap[f])
       
   172         tn = ""
       
   173         sys.stdout.write(mdiff.unidiff(to, tn, f))
       
   174 
   182 
   175 elif cmd == "addremove":
   183 elif cmd == "addremove":
   176     (c, a, d) = repo.diffdir(repo.root, repo.current)
   184     (c, a, d) = repo.diffdir(repo.root, repo.current)
   177     repo.add(a)
   185     repo.add(a)
   178     repo.remove(d)
   186     repo.remove(d)