Michael Murtaugh
9 years ago
3 changed files with 144 additions and 0 deletions
@ -0,0 +1,31 @@ |
|||||
|
#!/usr/bin/env python |
||||
|
|
||||
|
from argparse import ArgumentParser |
||||
|
import json, os, re |
||||
|
from urllib import urlencode |
||||
|
from urllib2 import urlopen, HTTPError, URLError |
||||
|
|
||||
|
def group (items, key=lambda x: x): |
||||
|
ret = [] |
||||
|
keys = {} |
||||
|
for item in items: |
||||
|
k = key(item) |
||||
|
if k not in keys: |
||||
|
keys[k] = [] |
||||
|
keys[k].append(item) |
||||
|
for k in sorted(keys): |
||||
|
keys[k].sort() |
||||
|
ret.append(keys[k]) |
||||
|
return ret |
||||
|
|
||||
|
def main(args): |
||||
|
p = ArgumentParser("") |
||||
|
p.add_argument("input", nargs="+", help="filenames") |
||||
|
args = p.parse_args(args) |
||||
|
|
||||
|
inputs = args.input |
||||
|
inputs.sort() |
||||
|
def base (x): |
||||
|
return re.sub(r"(\.html)|(\.diff\.html)|(\.meta\.json)|(\.txt)$", "", x) |
||||
|
from pprint import pprint |
||||
|
pprint(group(inputs, base)) |
@ -0,0 +1,112 @@ |
|||||
|
#!/usr/bin/env python |
||||
|
from __future__ import print_function |
||||
|
from argparse import ArgumentParser |
||||
|
import sys, json, re, os |
||||
|
from datetime import datetime |
||||
|
from urllib import urlencode |
||||
|
from urllib2 import urlopen, HTTPError, URLError |
||||
|
from math import ceil, floor |
||||
|
from common import * |
||||
|
|
||||
|
""" |
||||
|
status (meta): |
||||
|
Update meta data files for those that have changed. |
||||
|
Check for changed pads by looking at revisions & comparing to existing |
||||
|
|
||||
|
|
||||
|
design decisions... |
||||
|
ok based on the fact that only the txt file is pushable (via setText) |
||||
|
it makes sense to give this file "primacy" ... ie to put the other forms |
||||
|
(html, diff.html) in a special place (if created at all). Otherwise this |
||||
|
complicates the "syncing" idea.... |
||||
|
|
||||
|
""" |
||||
|
|
||||
|
class PadItemException (Exception): |
||||
|
pass |
||||
|
|
||||
|
class PadItem (): |
||||
|
def __init__ (self, padid=None, path=None, padexists=False): |
||||
|
self.padexists = padexists |
||||
|
if padid and path: |
||||
|
raise PadItemException("only give padid or path") |
||||
|
if not (padid or path): |
||||
|
raise PadItemException("either padid or path must be specified") |
||||
|
if padid: |
||||
|
self.padid = padid |
||||
|
self.path = padpath(padid, group_path="g") |
||||
|
else: |
||||
|
self.path = path |
||||
|
self.padid = padpath2id(path) |
||||
|
|
||||
|
@property |
||||
|
def status (self): |
||||
|
if self.fileexists: |
||||
|
if self.padexists: |
||||
|
return "S" |
||||
|
else: |
||||
|
return "F" |
||||
|
elif self.padexists: |
||||
|
return "P" |
||||
|
else: |
||||
|
return "?" |
||||
|
|
||||
|
@property |
||||
|
def fileexists (self): |
||||
|
return os.path.exists(self.path) |
||||
|
|
||||
|
def ignore_p (path, settings=None): |
||||
|
if path.startswith("."): |
||||
|
return True |
||||
|
|
||||
|
def main (args): |
||||
|
p = ArgumentParser("Check for pads that have changed since last sync (according to .meta.json)") |
||||
|
# p.add_argument("padid", nargs="*", default=[]) |
||||
|
p.add_argument("--padinfo", default=".etherdump/settings.json", help="settings, default: .etherdump/settings.json") |
||||
|
p.add_argument("--zerorevs", default=False, action="store_true", help="include pads with zero revisions, default: False (i.e. pads with no revisions are skipped)") |
||||
|
p.add_argument("--pub", default=".", help="folder to store files for public pads, default: pub") |
||||
|
p.add_argument("--group", default="g", help="folder to store files for group pads, default: g") |
||||
|
p.add_argument("--skip", default=None, type=int, help="skip this many items, default: None") |
||||
|
p.add_argument("--meta", default=False, action="store_true", help="download meta to PADID.meta.json, default: False") |
||||
|
p.add_argument("--text", default=False, action="store_true", help="download text to PADID.txt, default: False") |
||||
|
p.add_argument("--html", default=False, action="store_true", help="download html to PADID.html, default: False") |
||||
|
p.add_argument("--dhtml", default=False, action="store_true", help="download dhtml to PADID.dhtml, default: False") |
||||
|
p.add_argument("--all", default=False, action="store_true", help="download all files (meta, text, html, dhtml), default: False") |
||||
|
args = p.parse_args(args) |
||||
|
|
||||
|
info = loadpadinfo(args.padinfo) |
||||
|
data = {} |
||||
|
data['apikey'] = info['apikey'] |
||||
|
|
||||
|
padsbypath = {} |
||||
|
|
||||
|
# listAllPads |
||||
|
padids = getjson(info['apiurl']+'listAllPads?'+urlencode(data))['data']['padIDs'] |
||||
|
padids.sort() |
||||
|
for padid in padids: |
||||
|
pad = PadItem(padid=padid, padexists=True) |
||||
|
padsbypath[pad.path] = pad |
||||
|
|
||||
|
files = os.listdir(args.pub) |
||||
|
files = [x for x in files if not ignore_p(x)] |
||||
|
files.sort() |
||||
|
for p in files: |
||||
|
pad = padsbypath.get(p) |
||||
|
if not pad: |
||||
|
pad = PadItem(path=p) |
||||
|
padsbypath[pad.path] = pad |
||||
|
|
||||
|
pads = padsbypath.values() |
||||
|
pads.sort(key=lambda x: (x.status, x.padid)) |
||||
|
|
||||
|
curstat = None |
||||
|
for p in pads: |
||||
|
if p.status != curstat: |
||||
|
curstat = p.status |
||||
|
if curstat == "F": |
||||
|
print ("New/changed files") |
||||
|
elif curstat == "P": |
||||
|
print ("New/changed pads") |
||||
|
elif curstat == ".": |
||||
|
print ("Up to date") |
||||
|
print (" ", p.status, p.padid) |
Loading…
Reference in new issue